In the past, application programs consisted of a single monolithic binary file. Once a compiler generated the application program, the application program did not change until a next version was recompiled and shipped. Changes in an operating system, hardware and market demands were dependent on waiting for the next version to be implemented and recompiled. Today, application programs are comprised of several components—additionally, many of these components are linked at runtime. These components include dynamically linked libraries (DLLs) and other files that are shared by different application programs. These DLLs are listed within tables in application components to be linked at runtime. An operating system will search in a loader search path, application directory, operating system directory or user specified path for the name of the dynamic linked library, so that DLL code can be loaded into memory for execution. Since these DLLs can be shared by different application programs, changes to a DLL for one application may cause another application to stop operating.
Furthermore, many application programs running on operating systems, such as Microsoft® Windows® Operating System employ shared operating system components. One of the primary issues faced by administrators and developers on the current Microsoft® Windows® Operating System platform is the inability to control an exact set of dynamic link libraries and other files that will run as part of a deployed application program. It is quite common to have installation of one application program affect other application programs by overwriting files that those applications depend on. Unfortunately, there is no built in support in Microsoft® Windows® Operating System to detect when a file that an application depends on has changed.
In some situations, components may be changed and the application program may still choose to run if the integrity of the change can be trusted. For example, if a publisher of a component corrects a minor error in a component, the application program may still operate without a problem. Also, if a version upgrade has occurred by a trusted publisher, the application program may desire to accept a version upgrade and execute the component. However, if the component has been altered by an untrusted third party, execution of the code can result in damage to the software and hardware of the environment that the application program is operating on. Some codes include versioning information in the name of the component (e.g., foo1.dll, kernel2.dll). Since application programs reference these components by name, a change in the name will cause the application program to terminate its operation or use an old version of the component residing on the system.
Part of a component's identity is a simple, friendly textual name (e.g., My401kApp). These names are given to the component by the developer when the component is authored. These names are referred to as simple names. Simple names are not guaranteed to be unique and there is not any tool or anything in the runtime to prevent duplicate names from collisions. Simple names for components are easy and convenient to use and are sufficient in a number of situations. In particular, individual developers or small development shops do not have a need for a more sophisticated naming scheme. However, there are a number of situations where developers must be able to guarantee that the names they choose for their components will be globally unique. In COM, uniqueness is guaranteed by assigning a unique GUID to each component. However, GUIDs have a number of deficiencies. In particular, while GUIDs are unique when they are generated, nothing prevents another developer from later reusing the GUID and “substituting” their code in place of another's code.
Accordingly, there is an unmet need in the art for a system and method for ensuring and verifying integrity of components employed by application programs during runtime. There is also a need for a tool for verifying integrity of components at runtime. There is also a need for guaranteeing name uniqueness of these components and preventing name spoofing.